home *** CD-ROM | disk | FTP | other *** search
- /***********************************************************
- "ADBLights.c"
-
- Routines for controlling the lights on an extended keyboard
-
- (C) 1991 SPLAsh Resources. All rights reserved.
- [ See "THINKin' CaP", Winter 1991 ]
-
- using Symantec's "THINK C", v 5.00
- ***********************************************************/
-
-
-
- #include <DeskBus.h>
- #include <GestaltEqu.h>
- #include <Traps.h>
- #include "ADBLights.h"
-
- #include "protos"
-
- #include "globals.h"
- #include "extern.h"
-
-
-
-
- /* ++++++++++++++++++++
- ** Our local prototype:
- ** ++++++++++++++++++++ */
-
- pascal void ADBCompletion (void);
-
-
-
- #define Type_ExtKbd 2
- #define Addr_ExtKbd 2
-
- #define Talk_Reg2 0x0E
- #define Listen_Reg2 0x0A
-
- #define Bit_NumLock 0x01
- #define Bit_CapsLock 0x02
- #define Bit_ScrollLock 0x04
-
-
-
-
- Boolean hasADB (void) {
-
- return (TrapAvailable(_ADBOp));
-
- } /* hasADB */
-
-
-
- Boolean hasExtendedKybd (void) {
-
- Boolean result;
- long myFeature;
- OSErr whoCares;
- SysEnvRec theWorld;
-
-
- if (TrapAvailable(_GestaltDispatch))
- result = (
- (Gestalt(gestaltKeyboardType, &myFeature) == noErr)
- &&
- BitTst(&myFeature, 31 - gestaltExtADBKbd)
- );
- else {
- whoCares = SysEnvirons(1, &theWorld);
- result = (theWorld.keyBoardType == envAExtendKbd);
- }
-
-
- } /* hasExtendedKybd */
-
-
-
- /* ---------------------------------------
- ** Return the number of extended keyboards
- ** and a list of their addresses
- ** --------------------------------------- */
-
- void FindExtKeyboards (short *numExtKbd, ADBAddrList addresses) {
-
- short numADBs, i;
- ADBAddress theAddr;
- ADBDataBlock macADBData;
-
- *numExtKbd = 0;
- numADBs = CountADBs();
-
- for (i = 1; i <= numADBs; i++)
- {
- /* Get info about each ADB device: */
- theAddr = GetIndADB(&macADBData, i);
-
- if ( (macADBData.devType == Type_ExtKbd)
- &&
- (macADBData.origADBAddr == Addr_ExtKbd) )
-
- /* Extended keyboard found. */
- /* Store address and increase count. */
- addresses[(*numExtKbd)++] = theAddr;
- }
-
- } /* FindExtKeyboards */
-
-
-
- /* ---------------------------------------------------
- ** Set the state of the LEDs on one extended keyboard.
- ** --------------------------------------------------- */
-
- OSErr Set1ADBLights (ADBAddress kbdAddress, LightStruct *lights) {
-
- Boolean opCompleted;
- OSErr err;
- short commandNum;
- unsigned char buffer[9];
- char lightByte;
-
-
- /* Determine the current status of its LEDs: */
- commandNum = (kbdAddress << 4) + Talk_Reg2;
- opCompleted = FALSE;
- ;
- err = ADBOp((Ptr)&opCompleted, (ProcPtr)&ADBCompletion, (Ptr)buffer, commandNum);
- if (err != noErr) return (err);
-
- while (!opCompleted) ; /* Wait for a reply. */
-
- /* Now that we've got the initial status of the LEDs,
- convert Talk into a Listen command to change them: */
-
- commandNum = (commandNum & 0xFFF0) + Listen_Reg2;
-
- /* buffer contains the register value, which is stored as a length
- byte followed by the bit settings. The low three bits of the
- last byte hold the LED settings. */
-
- lightByte = buffer[buffer[0]];
-
- /* Set the LED bits depending on how we want to change the lights: */
-
- if (lights->numLock == Light_On) lightByte &= ~Bit_NumLock;
- else if (lights->numLock == Light_Off) lightByte |= Bit_NumLock;
- else if (lights->numLock == Light_Toggle) lightByte ^= Bit_NumLock;
-
- if (lights->capsLock == Light_On) lightByte &= ~Bit_CapsLock;
- else if (lights->capsLock == Light_Off) lightByte |= Bit_CapsLock;
- else if (lights->capsLock == Light_Toggle) lightByte ^= Bit_CapsLock;
-
- if (lights->scrollLock == Light_On) lightByte &= ~Bit_ScrollLock;
- else if (lights->scrollLock == Light_Off) lightByte |= Bit_ScrollLock;
- else if (lights->scrollLock == Light_Toggle) lightByte ^= Bit_ScrollLock;
-
- /* Stuff our modified byte back into the buffer */
-
- buffer[buffer[0]] = lightByte;
-
- return ( ADBOp(nil, nil, (Ptr)buffer, commandNum) );
-
- } /* Set1ADBLights */
-
-
-
- /* -------------------------------------------------------
- ** This routine is called when the ADB finishes responding
- ** to a command. We set a Boolean flag to TRUE so that the
- ** routine that issued the command will know that it has
- ** been completed.
- ** ------------------------------------------------------- */
-
- pascal void ADBCompletion (void) {
-
- // short commandNum;
- // Ptr buffer;
- Boolean *opCompleted;
-
-
- asm {
- // move.w d0, commandNum;
- // move.l a0, buffer;
- move.l a2, opCompleted;
- }
-
- *opCompleted = TRUE; /* Now, on with the show !!! */
-
- } /* ADBCompletion */
-
-
-
- void BlinkAllADBLights (void) {
-
- short numExtKbd, i, j, k;
- ADBAddrList addresses;
- LightStruct lights,
- blinkNum = { Light_Toggle, Light_Same, Light_Same },
- blinkCaps = { Light_Same, Light_Toggle, Light_Same },
- blinkScroll = { Light_Same, Light_Same, Light_Toggle };
- long finalTicks;
-
-
- if (!hasADB || !hasExtendedKybd) return;
-
- FindExtKeyboards(&numExtKbd, addresses);
-
- for (i = 0; i <= 7; ++i) /* Even # so we end up where we started. */
- {
- for (j = 0; j <= numExtKbd - 1; ++j)
- {
- lights.numLock = Light_Toggle;
- lights.capsLock = Light_Same;
- lights.scrollLock = Light_Same;
- Set1ADBLights (addresses[j], &lights);
- Delay(8, &finalTicks);
- ;
- lights.numLock = Light_Toggle;
- lights.capsLock = Light_Toggle;
- lights.scrollLock = Light_Same;
- Set1ADBLights (addresses[j], &lights);
- Delay(8, &finalTicks);
- ;
- lights.numLock = Light_Same;
- lights.capsLock = Light_Toggle;
- lights.scrollLock = Light_Toggle;
- Set1ADBLights (addresses[j], &lights);
- Delay(8, &finalTicks);
- ;
- lights.numLock = Light_Same;
- lights.capsLock = Light_Same;
- lights.scrollLock = Light_Toggle;
- Set1ADBLights (addresses[j], &lights);
- Delay(8, &finalTicks);
- } /* j loop */
-
- } /* i loop */
-
- //////////
-
- for (j = 0; j <= numExtKbd - 1; ++j)
- {
- for (k = 1; k <= 6; ++k) /* Another even #. */ {
- Set1ADBLights (addresses[j], &blinkNum);
- Delay(8, &finalTicks);
- }
- for (k = 1; k <= 6; ++k) {
- Set1ADBLights (addresses[j], &blinkCaps);
- Delay(8, &finalTicks);
- }
- for (k = 1; k <= 6; ++k) {
- Set1ADBLights (addresses[j], &blinkScroll);
- Delay(8, &finalTicks);
- }
- } /* j loop */
-
- } /* BlinkAllADBLights*/
-
-
-
-
-
- /* { end file = "ADBLights.c" } */
-